package com.terry.test3;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * 【字符匹配】
 *
 * 给你一个字符串数组（每个字符串均由小写字母组成）和一个字符规律（由小写字母和.和*组成），识别数组中哪些字符串可以匹配到字符规律上。 '.' 匹配任意单个字符，'*' 匹配零个或多个前面的那一个元素，所谓匹配，是要涵盖整个字符串的，而不是部分字符串。
 *
 * 输入描述：
 *
 * 第一行为空格分割的多个字符串，1<单个字符串长度<100，0，1<字符串个数<100
 *
 * 第二行为字符规律，1<字符串个数<100 第二行为字符规律，1><=字符规律长度<=50
 *
 * 不需要考虑异常场景
 *
 * 输出描述：
 *
 * 匹配的字符串在数组中的下标（从0开始），多个匹配时下标升序并用,分割，若均不匹配输出-1
 *
 * 示例1：
 *
 * 输入
 *
 * ab aab
 *
 * .*
 *
 * 输出
 *
 * 0,1
 *
 *
 *
 * 知识点：字符串贪心
 *
 * 【字符串序列判定】
 *
 * 输入两个字符串S和L，都只包含英文小写字母。S长度<=100，L长度<=500,000。判定S是否是L的有效字串。
 *
 * 判定规则：S中的每个字符在L中都能找到（可以不连续），且S在Ｌ中字符的前后顺序与S中顺序要保持一致。（例如，S="ace"是L="abcde"的一个子序列且有效字符是a、c、e，而"aec"不是有效子序列，且有效字符只有a、e）
 *
 * 输入描述：
 *
 * 输入两个字符串S和L，都只包含英文小写字母。S长度<=100，L长度<=500,000。
 *
 * 先输入S，再输入L，每个字符串占一行。
 *
 * 输出描述：
 *
 * S串最后一个有效字符在L中的位置。（首位从0开始计算，无有效字符返回-1）
 *
 * 示例1：
 *
 * 输入
 *
 * ace
 *
 * abcde
 *
 * 输出
 *
 * 4
 *
 *
 * @author 小八
 * @date 2023年02月10日11:36
 */
public class Title14 {

    public static void main(String[] args) {
        String arr[] = new String[]{"ab","aab"};
        String line = ".*";

        Deque<Character> deque = new ArrayDeque<>();
        for(int i =0;i<arr.length;i++){
            deque.clear();


        }
    }

    public static boolean match2(char[] a1,char[] a2,int index1,int index2){
        if(index2>=a2.length){return index1>=a1.length;}
        boolean match  = (index1<a1.length) && (a1[index1] == a2[index2] || a2[index2] == '.');
        if(a2.length-index2>=2 && a2[index2+1] == '*'){
            return match2(a1,a2,index1,index2+2) || (match && match2(a1,a2,index1+1,index2));
        }
        return match && match2(a1,a2,index1+1,index2+1);
    }

    public static boolean isMatch(String line,String regex){
        if(regex.isEmpty()){
            return line.isEmpty();
        }
        boolean match = !line.isEmpty() && (line.charAt(0)==regex.charAt(0) || regex.charAt(0)=='.');
        //看 匹配一次
        //不看  不匹配
        if(regex.length()>=2 && regex.charAt(1) == '*'){
            return isMatch(line,regex.substring(2))  || (match && isMatch(line.substring(1),regex));
        }
        return match && isMatch(line.substring(1),regex.substring(1));
    }
}
